本文介绍如何在ACK灵骏托管版集群中的灵骏节点上使用共享GPU调度(eGPU),实现GPU的调度和隔离能力。
索引
前提条件
已创建ACK灵骏托管版集群,并且集群带有GPU的灵骏节点。具体操作,请参见创建带有ACK的灵骏集群服务。
ACK灵骏托管版集群默认会安装基于eGPU的共享GPU调度组件,您可以在ACK灵骏托管版集群中直接使用基于eGPU的GPU共享能力。关于如何判断集群是否已安装基于eGPU的共享GPU组件的具体操作,请参见如何查看是否已安装基于eGPU的共享GPU组件?。
共享GPU调度组件的安装没有机型限制。但目前由于eGPU对H800的灵骏机型上的能力暂不支持,所以该机型的GPU显存与算力隔离能力暂时无法正常使用。如您需要使用GPU显存与算力隔离能力,请使用其他机型的灵骏节点。
步骤一:开启GPU共享调度能力
为灵骏节点开启GPU共享调度能力的步骤如下。
查找/etc/lingjun_metadata文件是否存在。
如果文件存在,然后执行命令
nvidia-smi
,输出正常,表明预期开启共享GPU调度能力的节点是灵骏节点,可继续执行下一步。如果文件不存在,表明预期开启共享GPU调度能力的节点不是灵骏节点,因此此节点无法开启GPU共享调度能力。如果需要开启GPU共享调度能力,请创建灵骏节点。具体操作,请参见灵骏节点池。
执行如下命令,通过给节点设置标签
ack.node.gpu.schedule
为节点开启共享GPU调度能力。kubectl label node <NODE_NAME> ack.node.gpu.schedule=<SHARE_MODE>
说明如果标签的Value为
egpu_mem
,表示只进行GPU显存隔离。如果Value设置为egpu_core_mem
,表示进行GPU显存和算力双隔离。您可以只申请GPU显存资源,但是如果要申请GPU算力资源,则需要同时申请GPU显存资源和GPU算力资源。
步骤二:使用GPU共享资源
下文以设置标签的Value为egpu_core_mem
为例进行说明。
等待节点将共享GPU的资源上报结束。
执行如下命令,查看Node资源信息。
kubectl get node <NODE_NAME> -oyaml
预期输出:
allocatable: aliyun.com/gpu-core.percentage: "100" aliyun.com/gpu-count: "1" aliyun.com/gpu-mem: "80" ... nvidia.com/gpu: "0" ... capacity: aliyun.com/gpu-core.percentage: "100" aliyun.com/gpu-count: "1" aliyun.com/gpu-mem: "80 ... nvidia.com/gpu: "0" ...
预期输出表明,资源列表中存在
aliyun.com/gpu-mem
和aliyun.com/gpu-core.percentage
资源。使用GPU共享资源。具体使用方法,请参见安装共享GPU调度组件。
说明如果Pod需要调度并使用整卡资源,则需要在目标Pod上增加Label
ack.gpushare.placement=require-whole-device
,然后指定需要使用的GPU显存数量为gpu-mem
,则该Pod会被默认调度到拥有该数量显存的整张GPU上。
步骤三:运行共享GPU示例
使用如下YAML提交Benchmark任务。
apiVersion: batch/v1 kind: Job metadata: name: benchmark-job spec: parallelism: 1 template: spec: containers: - name: benchmark-job image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=500000000 - --batch_size=8 resources: limits: aliyun.com/gpu-mem: 10 aliyun.com/gpu-core.percentage: 60 workingDir: /root restartPolicy: Never hostNetwork: true tolerations: - operator: Exists
执行如下命令,提交任务。
kubectl apply -f benchmark.yaml
等待Pod运行起来后,使用如下命令,进入Pod。
kubectl exec -ti benchmark-job-xxxx bash
在容器中执行如下命令,查看GPU隔离情况。
vgpu-smi
预期输出:
+------------------------------------------------------------------------------+ | VGPU_SMI 460.91.03 DRIVER_VERSION: 460.91.03 CUDA Version: 11.2 | +-------------------------------------------+----------------------------------+ | GPU Name Bus-Id | Memory-Usage GPU-Util | |===========================================+==================================| | 0 xxxxxxxx 00000000:00:07.0 | 8307MiB / 10782MiB 60% / 60% | +-------------------------------------------+----------------------------------+
预期输出表明,Pod容器被分配了10 GB的显存和GPU上60%的算力资源。
常见问题
如何查看是否已安装基于eGPU的共享GPU组件?
执行如下命令,查看是否已安装基于eGPU的共享GPU组件。
kubectl get ds -nkube-system | grep gpushare
预期输出:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
gpushare-egpu-device-plugin-ds 0 0 0 0 0 <none>
gpushare-egpucore-device-plugin-ds 0 0 0 0 0 <none>
预期输出表明,基于eGPU的共享GPU组件已安装。
- 本页导读 (1)